//
//  StatusSAL.swift
//  Weibo8023
//
//  Created by styshy on 15/12/22.
//  Copyright © 2015年 sz. All rights reserved.
//

import Foundation

// 最大清理缓存的时间
private let maxCacheDateTime:NSTimeInterval = 60 //* 60 * 24 * 7

// 微博数据访问层
class StatusDAL{
    
    class func clearDataCache() {
        // 准备日期
        let date = NSDate(timeIntervalSinceNow: maxCacheDateTime)
        
        let df = NSDateFormatter()
        // 指定区域，在真机测试的时候一定要指定区域
        df.locale = NSLocale(localeIdentifier: "en")
        // 指定日期格式
        df.dateFromString("yyyy-MM-dd HH:mm:ss")
        
        let dateStr = df.stringFromDate(date)
        
        let sql = "DELETE FROM T_Status WHERE createTime < ? ;"
        
        SQLiteManager.sharedManager.queue.inDatabase { (db) -> Void in
            if db.executeUpdate(sql, dateStr) {
                print("删除了 \(db.changes()) 条数据")
            }
        }
    }
    
    
    class func loadStatus(since_id:Int, max_id:Int, finished:(array:[[String:AnyObject]]?) -> ()){
        // 1.检查本地是否存在缓存
        let array = checkChacheData(since_id, max_id: max_id)
        
        // 2.如果存在缓存，直接调用
        if array?.count > 0{
            finished(array: array!)
            return
        }
        
        print("加载网络数据")
        // 3.如果缓存不存在，通过网络加载
        NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
            if error != nil{
                print("出错了")
                finished(array: nil)
                return
            }
            // 判断 result 的数据结构是否争取
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                print("数据格式错误")
                
                finished(array: nil)
                return
            }
            
            // 将返回的网络数据保存
            StatusDAL.saveCacheData(array)
            
            // 通过闭包返回结果
            finished(array: array)

        }
        
        // 4.将加载的网络数据缓存到本地
        
        // 5.将数据返回
    }
    
    class func checkChacheData(since_id:Int, max_id:Int) -> [[String:AnyObject]]?{
        guard let userId = UserAccountViewModel.sharedUserAccount.account?.uid else{
            print("用户没有登录")
            return nil
        }
        
        // 准备sql
        var sql = "SELECT statusId, status, userId FROM T_Status \n"
        sql += "WHERE userId = \(userId) \n"
        
        if since_id > 0{// 执行下拉刷新
            sql += "    AND statusId > \(since_id) \n"
        } else if max_id > 0{// 上拉刷新
            sql += "    AND status < \(max_id) \n"
        }
        
        sql += "ORDER BY statusId DESC LIMIT 20;"
        
        print("查询的sql -- \(sql)")
        
        // 执行sql
        let array = SQLiteManager.sharedManager.execRecordSet(sql)
        
        var arrayM = [[String:AnyObject]]()
        
        for dict in array {
            let jsonData = dict["status"] as! NSData
            
            let result = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
            
            arrayM.append(result as! [String : AnyObject])
        }
        
        // 返回查询结果
        return arrayM
    }
    
    
    /**
     将网络加载的数据保存到本地服务器
     
     - parameter array: 字典数据
     */
    class func saveCacheData(array:[[String:AnyObject]]){
        guard let userId = UserAccountViewModel.sharedUserAccount.account?.uid else{
            print("用户没有登录")
            return
        }
        
        // 创建sql
        let sql = "INSERT OR REPLACE INTO T_Status (statusId, status, userId) VALUES (?,?,?);"
        
        // 执行sql
        SQLiteManager.sharedManager.queue.inTransaction { (db, rollBack) -> Void in
            for dict in array{
                // 取出微博
                let statusId = dict["id"] as! Int
                // 序列化字典 -> 二进制数据
                let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
                
                // 这边数据顺序，尽量跟VALUES中的顺序一致，否则出错
                let values:[AnyObject] = [statusId,json,userId]
                // Question:插入数据
                try! db.executeUpdate(sql, values: values)
                
            }
        }
        
        print("数据插入完成")
        
    }
    
    
}